package org.litemall.netty.exection;

import org.litemall.netty.nettyDoman.Result;
import org.springframework.validation.ObjectError;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * @Author Lizr
 * @Description 全局异常
 * @CreateTime 2021-12-17 下午 3:09
 **/
@RestControllerAdvice
public class ExectionController {
    @ExceptionHandler(HttpRequestMethodNotSupportedException.class)
    @ResponseBody
    public Object HttpRequestMethodNotSupportedException(HttpRequestMethodNotSupportedException  e){
        String error = "不支持: ".concat(e.getMethod()).concat(" 请求方式");
        return Result.error(error);
    }
    /**
     * 请求参数异常
     * @param e
     * @return
     */
    @ExceptionHandler(MissingServletRequestParameterException.class)
    @ResponseBody
    public Object missingServletRequestParameterException(MissingServletRequestParameterException e){
        String error = String.format("参数名称: %s 不能为空，类型: %s", e.getParameterName(), e.getParameterType());
        return Result.error(error);
    }
    /** 自定义 处理  MethodArgumentNotValidException 参数校验错误
     * @param e
     * @return 根据自定义返回结果 返回对应内容
     * 如果 使用的是 org.hibernate.validator jar 的话 使用:
     * MethodArgumentNotValidException.class 捕捉参数校验异常
     * 如果是 SpringBoot默认的校验  使用:
     * org.springframework.validation.BindException.class 捕捉参数校验异常
     * 我这里使用的是  SpringBoot默认的
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    @ResponseBody
    public Object BindException(MethodArgumentNotValidException e) {
        StringBuilder sb = new StringBuilder();
        for (ObjectError error: e.getBindingResult().getAllErrors()) {
            sb.append(error.getDefaultMessage());
            sb.append("、");
        }
        String errorMsg = sb.substring(0,sb.length() - 1).toString();
        return Result.error(errorMsg);
    }
    @ExceptionHandler(value = ServiceExection.class)
    public Result ServiceExection(ServiceExection e){
        return Result.error(e.getMessage());
    }
    @ExceptionHandler(value = RuntimeException.class)
    public Result RuntimeException(RuntimeException e){
        return Result.error("运行时异常,原因：".concat(e.getMessage()));
    }
    @ExceptionHandler(value = Exception.class)
    public Result Exception(Exception e){
        return Result.error("运行时异常,原因：".concat(e.getMessage()));
    }


}
